// 迭代器设计模式

// 场景： 你我协同开发一个任务清单应用

// 我的代码 ================================
const todos = {
    life: ['吃饭', '睡觉', '打豆豆'],
    learn: ['语言', '数学', '外语'],
    work: ['喝茶'],
    // 对外提供一个的接口 调用者不必关心调用的结构 不用担心改变所带来的影响
    each: function (callback) {
        const all = [].concat(this.life, this.learn, this.work)
        for (const item of all ) {
            callback(item)
        }
    },

    //使用可迭代接口方式解决该问题
    [Symbol.iterator]: function() {
        const all = [...this.life, ...this.learn, ...this.work]
        let index = 0
        return {
            next: function () {
                return {
                    value: all[index],
                    done: index++ >= all.length
                }
            }
        }
    }
}

// 你的代码 ==================={==============
// for (const item of todos.life) {
//     console.log(item);
// }
// for(const item of todos.learn) {
//     console.log(item);
// }


todos.each(function (item) {
    console.log(item);
})

console.log('-----------------------------------------------');

for (const item of todos) {
    console.log(item);
}

// 对外提供统一的接口 使得外部不用关心内部结构如何
// 其适用于任何数据类型